package continuity;

import java.util.List;

/**
 * Zetor csapat szekelton
 * 
 * A program célja hogy a modellről eldönthető legyen, hogy a feladat egy helyes
 * megoldását nyújtja.
 * 
 * @author Balogh Peter Tamas
 * @author Gál István László
 * @author Kárász Gábor
 * @author Simon Endre András
 * @author Szabó Alex
 */
public class LevelItem {

    private int pos_x;
    private int pos_y;
    private int id;
    private List<Sprite> sprites;
    /**
     * A szkeleton tesztelésének megkönnyítése érdekében minden osztályban szerepel 
     * className osztályszintű attribútum, mely az osztály nevét tartalmazza.
     */
    static public String className = "LevelItem";
    /**
     * A szkeleton tesztelésének egkönnyítésének érdekében minden osztályban szerepel
     * a name attribútum, mely az osztály egyedi nevét tartalmazza.
     */
    public String name;

    /**
     * 
     * @param n - az osztálynevet bállíthatjuk konstruktorból
     */
    public LevelItem(String n) {
        name = n;
    }

    /**
     * 
     * @param dir - megnézi a hogy ha a karakter dir irányba halad, át lehet-e menni
     * a pályaelemek köztt
     * @return - igazzal tér vissza há át lehet haladni a pályaelemek közt, és hamissal
     * ha nem
     */
    public boolean checkNeighbour(int dir) {
        String classInfo = name + "(" + className + ")::CheckNeighbour(): bool";
        Continuity.methodEntry(classInfo);

        if (Continuity.Question("Atjarhatoak a palyaelemek?", 'y', 'n')) {
            Continuity.methodExit(classInfo);
            Continuity.methodVoid();
            return true;
        } else {
            Continuity.methodExit(classInfo);
            Continuity.methodVoid();
            return false;
        }

    }

    /**
     *  A LevelItem X koordiátáját adja vissza a Levelen belül
     */
    public void getPos_x() {
        String classInfo = name + "(" + className + ")::getPos_x(): int";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * 
     * @param dir - A karakter itt jelenti be a LevelItemnek, hogy ozogni fog.
     */
    public void move(int dir) {
        String classInfo = name + "(" + className + ")::move(int dir): void";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * A LevelItem Y koordinátáját adja vissza a Levelen belül.
     */
    public void getPos_y() {
        String classInfo = name + "(" + className + ")::getPos_y: void";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * 
     * @param s - hozzáadja az s Spriteot
     */
    public void addSprite(Sprite s) {
        String classInfo = name + "(" + className + ")::AddSprite(Sprite s): void";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * 
     * @param s - Az s spriteot ütközteti az összes, a pályaelemen található 
     * spriteal.
     * @param teszt - A szkeleton működésének megkönnyítése érdekében a teszt 
     * számát átadó segédparaméter
     */
    public void intersectAll(Sprite s, int teszt) {
        String classInfo = name + "(" + className + ")::IntersectAll(Sprite s): void";
        Continuity.methodEntry(classInfo);
        Sprite k;
        if (teszt == 4) {
            k = new Key(new Point3d(), "key");
        } else if (teszt == 3) {
            k = new Door(new Point3d(), "door");
        } else {
            k = new Wall(new Point3d(), 1, 1, "wall");
        }

        Continuity.methodCall(className, name, s.getType(), (s).getName(), "checkHit(" + k.getName() + ")");
        s.checkHit(k);


        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * Az óraütést kezelő függvény.
     */
    public void Tick() {
        String classInfo = name + "(" + className + ")::Tick(): void";
        Continuity.methodEntry(classInfo);
        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }

    /**
     * 
     * @param position - megvizsgálja, hogy a karakter a pálya szélén van-e
     * @param dir - megadja a ozgás irányát, hogy tudjuk, a karakter el akarja-e
     * hagyni a pályát vagy sem
     */
    public void checkEdges(Point3d position, int dir) {
        String classInfo = name + "(" + className + ")::CheckNeighbour(): bool";
        Continuity.methodEntry(classInfo);

        if (Continuity.Question("Palya szelen vagyunk?", 'y', 'n')) {
            Continuity.Alt("Palya szelen vagyunk");

            LevelItem neighbour = new LevelItem("neighbour");
            Continuity.methodCall(className, name, LevelItem.className, neighbour.name, "checkNeighbour(dir): void");

            boolean res = neighbour.checkNeighbour(dir);
            if (res) {
                Continuity.Alt("Atjarhato palyaelemek");
                Character c = new Character(new Point3d(), null, "c");
                Continuity.methodCall(className, name, Character.className, c.name, "setCanMove(true): void");
                c.setCanMove(false);
                Level actual = new Level("ActualLevel");
                Continuity.methodCall(className, name, Level.className, actual.name, "setActiveItem(neighbour): void");
                actual.setActiveItem(new LevelItem("neigbour"));
                Continuity.AltEnd();
            } else {
                Continuity.Alt("Nem atjarhato palyaelemek");
                Character c = new Character(new Point3d(), null, "c");
                Continuity.methodCall(className, name, Character.className, c.name, "setCanMove(false): void");
                c.setCanMove(false);
                Continuity.AltEnd();
            }
            Continuity.AltEnd();
        } else {
            Continuity.Alt("Nem a palya szelen vagyunk");
            Continuity.AltEnd();
        }


        Continuity.methodExit(classInfo);
        Continuity.methodVoid();
    }
}
